package de.akabahn.ebd.stw.zdxfc.prs.commande.elemente;

import static de.akabahn.ebd.stw.zdxfc.prs.ZDXFCConstants.TASTE_GEDRUECKT;
import static de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeConstants.TASTE_GEDRUECKT_COLOR;
import static de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeConstants.TASTE_TEXT_FONT;

import java.awt.Button;
import java.awt.Color;

import org.apache.log4j.Logger;

import de.akabahn.ebd.stw.zdxfc.prs.commande.ZDXFCCommandeMain;
import de.akabahn.ebd.stw.zdxfc.prs.commande.listener.TastenListener;

/**
 * Implementierung einer <code>Taste</code> auf dem Bedienpult
 *
 * @author Peter Eimann
 * @since 1.0
 * @version 1.2
 */
public class Taste extends Button {
	private static final Logger LOG = Logger.getLogger(Taste.class);
	private static final long serialVersionUID = -2370661374773738120L;

	private ZDXFCCommandeMain main;
	private String id;
	private Color labelColor;
	private Color tasteAusColor;
	private Color tasteAnColor;
	private boolean an;
	private boolean blinkt;
	private int verzoegerung;
	private long loslassZeit;
	
	/**
	 * Initialisierung der Taste mit den uebergebenen Eigenschaften
	 * 
	 * @param id Eindeutige ID des Elements, wird fuer die Referenz auf das
	 *           Element benoetigt (die ID ist der Schluessel in den Maps, in
	 *           denen das Element gespeichert ist.
	 * @param tastenListener Die Listener-Klasse, die bei Aktionen auf der Taste aufgerufen wird
	 * @param label Text, der auf der Taste dargestellt werden soll
	 * @param labelColor Farbe des Texts auf dem Schalter
	 * @param tasteAusColor Farbe der Taste bei ausgeschalteter Ausleuchtung
	 * @param tasteAnColor Farbe der Taste bei eingeschalteter Ausleuchtung
	 * @param verzoegerung Verzoegerung in Millisekunden, nachdem das Loslassen der Taste ausgeloest wird
	 * @param main Referenz auf die Hauptklasse
	 * @see TastenListener
	 */
	public Taste(String id, TastenListener tastenListener, String label, Color labelColor, Color tasteAusColor, Color tasteAnColor, int verzoegerung, ZDXFCCommandeMain main) {
		super.addMouseListener(tastenListener);
		
		this.id = id;
		this.labelColor = labelColor;
		this.tasteAusColor = tasteAusColor;
		this.tasteAnColor = tasteAnColor;
		this.verzoegerung = verzoegerung;
		this.main = main;

		if (label != null) {
			setFont(TASTE_TEXT_FONT);
			setLabel(label);
		}
		setForeground(this.labelColor);
		setBackground(this.tasteAusColor);
	}
	
	/**
	 * Gibt die ID des Elements an
	 * 
	 * @return die ID
	 */
	public String getId() {
		return id;
	}

	/**
	 * Schaltet die Ausleuchtung der Taste ein
	 * 
	 * @see #lampeAn()
	 */
	public void ausleuchtungAn() {
		LOG.debug("Taste " + id + ": Auslechtung An");
		an = true;
		blinkt = false;
		lampeAn();
	}
	
	/**
	 * Schaltet die Ausleuchtung der Taste aus
	 * 
	 * @see #lampeAus()
	 */
	public void ausleuchtungAus() {
		LOG.debug("Taste " + id + ": Auslechtung Aus");
		an = false;
		blinkt = false;
		lampeAus();
	}
	
	/**
	 * Schaltet die Ausleuchtung der Taste auf blinkend
	 */
	public void ausleuchtungBlinkt() {
		LOG.debug("Taste " + id + ": Auslechtung Blinkt");
		blinkt = true;
	}

	/**
	 * Wird vom Tasten-Listener aufgerufen, wenn die Taste gedrueckt wird. Die Loslasszeit der Taste wird gesetzt
	 * (aktuelle Zeit plus Verzoegerung), die Taste wird als gedrueckt markiert und der gedrueckte Zustand in die DBD 
	 * geschrieben.
	 */
	public void tasteGedrueckt() {
		LOG.debug("Taste " + id + ": Gedrueckt, Verzoegerung: " + verzoegerung);
		loslassZeit = System.currentTimeMillis() + verzoegerung;
		setForeground(TASTE_GEDRUECKT_COLOR);
		repaint();
		
		if (!main.isDemoMode()) {
			main.getDbd().set(id, TASTE_GEDRUECKT);
		}
	}
	
	/**
	 * Wird vom Tasten-Listener aufgerufen, wenn die Taste losgelassen wird. Die Loslasszeit der Taste wird
	 * zurueckgesetzt, die Taste wird als losgelassen markiert und der losgelassene Zustand in die DBD geschrieben.
	 */
	public void tasteLosgelassen() {
		LOG.debug("Taste " + id + ": Losgelassen");
		loslassZeit = 0;
		setForeground(labelColor);
		repaint();
		
		if (!main.isDemoMode()) {
			main.getDbd().set(id, 0);
		}
	}
	
	/**
	 * Der Hintergrund der Taste wird auf die Farbe fuer den ausgeschalteten Zustand gesetzt
	 */
	public void lampeAus() {
		setBackground(tasteAusColor);
		repaint();
	}
	
	/**
	 * Der Hintergrund der Taste wird auf die Farbe fuer den eingeschalteten Zustand gesetzt
	 */
	public void lampeAn() {
		setBackground(tasteAnColor);
		repaint();
	}
	
	/**
	 * Gibt an, ob die Ausleuchtung der Taste eingeschaltet ist oder nicht
	 * 
	 * @return <code>true</code> - Die Ausleuchtung ist eingeschaltet
	 */
	public boolean isAn() {
		return an;
	}

	/**
	 * Gibt an, ob die Ausleuchtung der Taste blinkt oder nicht
	 * 
	 * @return <code>true</code> - Die Ausleuchtung blinkt
	 */
	public boolean isBlinkt() {
		return blinkt;
	}

	/**
	 * Gibt die Loslasszeit der Taste zurueck
	 * 
	 * @return Die Loslasszeit
	 */
	public long getLoslassZeit() {
		return loslassZeit;
	}
}
